11
תגובות

preg_match - לא להתייחס לרווחים

פתח nirbe ,
שלום,
הייתי מעוניין לדעת האם ואיך אפשר להתעלם מרווחים וריווחי שורות ב preg_match.
זה הביטוי:
/method (.*)\{(.*)\}/


הבעיה היא כאשר אני יורד שורה אחרי ה } וכותב משהו ויורד שורה וכותב }, אז PHP נותנת לי שגיאה, בגלל שאני חייב לכתוב הכל בשורה אחת.

איך אפשר להתעלם מהרווחים?

תודה רבה!

11 תשובות

avatar ענה intval ב 14 לספטמבר 2012 #

אז צריך לסמן בביטוי הרגולרי שיהיה תו } ואחריו יכול להיות ויכול שלא להיות תו של מעבר שורה.
תו של מעבר שורה מסמנים ב \n

avatar ענה nirbe ב 14 לספטמבר 2012 #

עשיתי את זה עכשיו:

/method (.*)\{\n(.*)\n\}/

והשורות זה:
method bla
{
    background-color: red;
}


וזה עדיין לא מחזיר לי כמו שצריך, עדיין את השגיאה..
זה הקוד:
$final = preg_match("/method (.*)\{\n(.*)\n\}/", $this->file, $matches);
$this->methods[$matches[1]] = $matches[2];

avatar ענה intval ב 14 לספטמבר 2012 #

<?php

$text = 'method bla
{
    background-color: red;
}'
;
preg_match("#method \s+ ([a-z0-9]+) [\s\r\n\t]* \{ [\s\r\n\t]* ([^\}]*) [\s\r\n\t]* \}#imsuUx", $text, $matches);
print_r($matches);

avatar ענה nirbe ב 15 לספטמבר 2012 #

תודה, אני צריך ללמוד איך זה פועל.
אבל עכשיו יש לי בעיה כשאני מנסה להכניס הכל למערך, ונגיד יש לי:

method bla
{
    background-color: red;
}

method blo
{
    background-color: red;
}

method ble
{
    background-color: red;
}


אני רוצה להכניס את כולם לתוך מערך, מפתח והתוכן שלו.
אני עושה משהו כזה:
preg_match("#method \s+ ([a-z0-9]+) [\s\r\n\t]* \{ [\s\r\n\t]* ([^\}]*) [\s\r\n\t]* \}#imsuUx", $text, $matches);
$this->methods[$matches[1]] = $matches[2];


וזה לא עובד, כי הוא מבצע את זה פעם אחת, אז בדקתי כמה שורות יש ועשיתי עם לולאה, זה לא עבד, אחר כך הגדלתי את הלולאה ל 20000 פעמים, וזה עדיין לא עבד...
ככה אני עושה את זה:
for ($i=1; $i<=$this->count;$i++)
{
  preg_match("#method \s+ ([a-z0-9]+) [\s\r\n\t]* \{ [\s\r\n\t]* ([^\}]*) [\s\r\n\t]* \}#imsuUx", $text, $matches);
  $this->methods[$matches[1]] = $matches[2];
}


* אני עכשיו מנסה לעשות את זה עם מערכים דו מימדים ו preg_match_all
יש מצב שאני מצליח, אם לא, אני יכתוב פה.

avatar ענה nirbe ב 15 לספטמבר 2012 #

אחרי שעתיים שלמות ששברתי בהם את הראש, הצלחתי!
תודה על העזרה, זה האתר מספר 1!

avatar ענה nirbe ב 16 לספטמבר 2012 #

intval, אני לא מבין מה עשית שם, אפשר הסבר כדי שאני יוכל לעשות את זה לבד מהראש שלי?
והאם יש איזה ביטוי קצר יותר?
אני מנסה לעשות כזה דבר:

#bla
{
 blo
}


ואני רוצה להוציא את ה BLA ואת ה BLO, ואני רוצה שלא משנה, גם אם זה יהיה בשורה אחת או בכמה שורות' זה תמיד יקלט.

avatar ענה intval ב 16 לספטמבר 2012 #

לפי המדריך הזה
תעבור תו תו ותנסה להבין מה הוא אומר.

אחרי שתסיים - תגיד לי איזה תו בדיוק לא הבנת ממה שכתוב שם :)

avatar ענה nirbe ב 16 לספטמבר 2012 #

הבנתי בערך והצלחתי בערך, אבל בתוך הבלוק יש לי משהו כזה:

#bla
{
 {test}
 color: white;
 border: 1px solid black;
}


עכשיו הוא נקטע לפני ה { האחרון אחרי ה test, איך אפשר לסדר שיתעלם ממנו ופשוט יחזיר למערך את זה:
{test}
 color: white;
 border: 1px solid black;


הוא מציג לי עכשיו
{test


זה הביטוי:
#\#(.*) [\s\r\n\t]* \{ [\s\r\n\t]* ([^\}]*) [\s\r\n\t]* \}#imsuUx


תודה רבה!

avatar ענה intval ב 16 לספטמבר 2012 #

בעיקרון אי אפשר, באיחוד במקרים שיש לך מחרוזת כמו

method bla
{
  {..}
}

method blu
{
  { .. }
}



או אפילו כימוס יותר עמוק שבתוך הסוגריים הפנימיות יהיה עוד איזה משהו
בגלל שאתה בביטוי הרגולרי שלך יכול לגרום לו לעצור או ב { הראשון
או ב { האחרון.

אם אתה רוצה שהוא ידלג על סוגריים פנימיים, תצטרך לכתוב לולאה משלך שעוברת תו-תו בטקסט וסופרת כמה סוגריים מסולסלות נפתחו ואחרי זה נסגרו.

אם רמת העומק המירבי הוא 2, כלומר בתוך הסוגריים המסולסלות הפנימיות לא יהיה עוד משהו שיכול להכיל סוגריים מסולסות - אז אפשר לנסות לכתוב ביטוי שמאשר סוגריים מסולסלות ואם היו כאלה, אז חייב להיות עוד סוגר מסולסל אחרי זה.

avatar ענה nirbe ב 16 לספטמבר 2012 #

פשוט נחליף את הסוגריים המסולסלות לרגילות, לא צריך להסתבך יותר מדי עכשיו.
תודה רבה! אם תיהיה לי בעיה אני אכתוב פה.

avatar ענה iiddaannyy ב 17 לספטמבר 2012 #

אפשר להוריד את המודיפיקטור U.